package com.lnsoft.cac.server.handle.codec.frameMessage;


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.Data;
import lombok.NonNull;

@Data
/**
 * 数据请求
 * */
public class ReqData_Msg {
    private int Measure_Point_ID;       //1byte     监测点号（无符号整数）
    private int Request_Type;           //1byte     请求数据类型—参考表A.2.8相关含义
    private int Data_Start_Time;        //4byte     请求数据的开始时间（世纪秒，解析到分钟）
    private int Data_End_Time;          //4byte     请求数据的结束时间（世纪秒，解析到分钟）


    public ByteBuf toByteBuf() throws Exception{
        if (!Util.measurePointIDIsAvailable(Measure_Point_ID)) {
            throw new Exception("监测点号 设置异常");
        }
        if (!Util.statTimeIsAvailable(Data_Start_Time)) {
            throw new Exception("请求数据的开始时间 设置异常");
        }
        if (!Util.statTimeIsAvailable(Data_End_Time)) {
            throw new Exception("请求数据的结束时间 设置异常");
        }
        ByteBuf bf = Unpooled.buffer(10);
        bf.writeByte(Measure_Point_ID);
        bf.writeByte(Request_Type);
        bf.writeIntLE(Data_Start_Time);
        bf.writeIntLE(Data_End_Time);
        return bf;
    }


    //  解析 [数据请求] 帧报文内容区 到消息体中
    public static ReqData_Msg decFrameBody(@NonNull byte[] frameBody) throws Exception {
        ByteBuf bf = Unpooled.wrappedBuffer(frameBody);
        ReqData_Msg msg = new ReqData_Msg();
        int len = frameBody.length;
        if (len == 0) {
            return null;
        }
        if (10 != len) {
            throw new Exception("frameBody 数据异常");
        }
        msg.setMeasure_Point_ID(bf.getUnsignedByte(0));
        msg.setRequest_Type(bf.getByte(1) & 0xFF);
        msg.setData_Start_Time(bf.getIntLE(2) & 0xFFFFFFFF);
        msg.setData_Start_Time(bf.getIntLE(6) & 0xFFFFFFFF);
        return msg;
    }
}
